/**
 *
 */
package br.com.werp.regras.tesouraria.controle;

import br.com.werp.regras.geral.Acesso;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.GerenciamentoPessoa;
import br.com.werp.regras.geral.Relatorio;
import br.com.werp.regras.geral.Suporte;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.util.JRDataSourcePadrao;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.pessoa.DependenteVO;
import br.com.werp.regras.geral.vos.relatorio.RelatorioVO;
import br.com.werp.regras.geral.vos.suporte.EmpresaVO;
import br.com.werp.regras.geral.vos.tabelas.Pessoa;
import br.com.werp.regras.geral.vos.tabelas.Usuario;
import br.com.werp.regras.geral.vos.tesouraria.RelatorioDependentesFormVO;
import br.com.werp.regras.geral.vos.tesouraria.RelatorioDependentesVO;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.Timestamp;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * @author marcos
 *
 */
public class ControleDependeteRelatorio {
    public RelatorioVO gerarRelatorioDependentes(Object form,
        String requisitor, String empresa) throws Exception {
        RelatorioDependentesFormVO relatorioDependentesFormVO = new RelatorioDependentesFormVO();
        BeanUtil.copiarVO(form, relatorioDependentesFormVO);

        Map parameters = BeanUtils.describe(form);

        List listaRelatorio = processarRelatorioDependentes(relatorioDependentesFormVO,
                requisitor);

        Usuario usuario = new Usuario();
        usuario.setUsur_login(requisitor);

        Acesso acesso = FabricaSubSistema.getAcesso();

        usuario = (Usuario) Util.get0(acesso.pesquisarUsuarios(usuario));

        Suporte suporte = FabricaSubSistema.getSuporte();
        EmpresaVO empresaVO = new EmpresaVO();
        empresaVO.setEmpr_id(Util.zeroOuInt(empresa));

        empresaVO = (EmpresaVO) Util.get0(suporte.obterEmpresaVO(empresaVO));

        Relatorio relatorio = FabricaSubSistema.getRelatorio();
        parameters.put("empresa", empresaVO.getEmpr_descricao());
        parameters.put(Relatorio.IMAGE_URI, "/tesouraria/imgJasper/");
        parameters.put("usuario", usuario.getUsur_nome());
        parameters.put("data_relatorio",
            new Timestamp(System.currentTimeMillis()));
        parameters.put("filtro_dependente",
            ((!Util.isNullOrEmpty(relatorioDependentesFormVO.getNome()))
            ? ("Dependente: " + relatorioDependentesFormVO.getNome()) : ""));

        return relatorio.processarRelatorio(new JRDataSourcePadrao(
                listaRelatorio), "RelatorioDependente",
            relatorioDependentesFormVO.getTipoRelatorio(), parameters,
            FabricaSubSistema.getTesouraria(), new HashMap(), new HashMap());
    }

    private List processarRelatorioDependentes(
        RelatorioDependentesFormVO relatorioDependentesFormVO, String requisitor)
        throws Exception {
        DependenteVO dependenteVO = new DependenteVO();
        GerenciamentoPessoa gerenciamentoPessoa = FabricaSubSistema.getGerenciamentoPessoa();

        if (!Util.isNullOrEmpty(relatorioDependentesFormVO.getNome())) {
            dependenteVO.setPess_nome(relatorioDependentesFormVO.getNome());
        }

        if (!Util.isNullOrEmpty(relatorioDependentesFormVO.getCpf())) {
            dependenteVO.setFisc_cpf(relatorioDependentesFormVO.getCpf());
        }

        List listaDependentes = gerenciamentoPessoa.obterDependentesIR(dependenteVO);
        List retorno = new LinkedList();

        for (Iterator iter = listaDependentes.iterator(); iter.hasNext();) {
            dependenteVO = (DependenteVO) iter.next();

            Pessoa pessoa = new Pessoa();
            pessoa.setPess_id(dependenteVO.getDepd_contribuinte());
            pessoa = (Pessoa) Util.get0(gerenciamentoPessoa.obterPessoa(pessoa));

            RelatorioDependentesVO relatorioDependentesVO = new RelatorioDependentesVO();

            if (pessoa != null) {
                relatorioDependentesVO.setNomeTitular(pessoa.getPess_nome());
            }

            Dia hoje = new Dia();

            Dia nascimento = new Dia(dependenteVO.getFisc_nascimento());

            relatorioDependentesVO.setIdade(hoje.daysBetween(nascimento) / 365);

            BeanUtil.copiarVO(dependenteVO, relatorioDependentesVO);

            retorno.add(relatorioDependentesVO);
        }

        return retorno;
    }

    public static void main(String[] executar) throws Exception {
        ControleDependeteRelatorio controleDependeteRelatorio = new ControleDependeteRelatorio();

        RelatorioDependentesFormVO relatorioDependentesFormVO = new RelatorioDependentesFormVO();
        relatorioDependentesFormVO.setTipoRelatorio(Relatorio.TIPO_HTML);

        Util.verRelartorio(controleDependeteRelatorio.gerarRelatorioDependentes(
                relatorioDependentesFormVO, "", ""));
    }
}
